class TicketsController < ApplicationController
  # GET /tickets
  # GET /tickets.xml
  def index
    @tickets = Ticket.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @tickets }
    end
  end

  # GET /tickets/1
  # GET /tickets/1.xml
  def show
    @ticket = Ticket.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @ticket }
    end
  end

  # GET /tickets/new
  # GET /tickets/new.xml
  def new
    @ticket = Ticket.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @ticket }
    end
  end

  # GET /tickets/1/edit
  def edit
    @ticket = Ticket.find(params[:id])
  end

  # POST /tickets
  # POST /tickets.xml
  def create
		puts "LINEA 43 CREATE"
		puts params[:nro_doc_pasajero_frec]
		puts params[:utilizarPromo]
		puts params[:ptos_requeridos]
		puts "LINEA 43 CREATE"

		# Verifica que el DNI ingresado es valido
		if params[:nro_doc_pasajero_frec].size <= 0 and params[:utilizarPromo]
			redirect_to  root_path, :notice => "No se ingreso el nro. de documento. No se registro la venta." and return
		end

		# Se calcula la cantidad de puntos a deducir
		if params[:tipoVenta] == 'Directa'
			as = params[:asiento]
			numT = as.size
		elsif params[:tipoVenta] == 'Reserva'
			numT = Reservation.where("codigo = ?", params[:codigoReserva]).size
		end

		# Verifica que exista el pasajero frecuente
		p = Passenger.find_by_numDocumento(params[:nro_doc_pasajero_frec].to_i)
		if p.nil? and params[:utilizarPromo] == "PROMO" then
			redirect_to  root_path, :notice => "No existe el pasajero frecuente. No se registro la venta." and return
		elsif !p.nil? and params[:utilizarPromo] == "PROMO"
			if p.esfrecuente == 0
				redirect_to  root_path, :notice => "No existe el pasajero frecuente. No se registro la venta." and return
			end
		end
		
		# Verifica que el pasajero frecuente tenga puntos necesarios
		if !p.nil? and (p.puntos < (params[:ptos_requeridos].to_i * numT)) and params[:utilizarPromo] == "PROMO"
			redirect_to  root_path, :notice => "Pasajero frecuente no tiene puntos necesarios. No se registro la venta." and return
		end

		# Se crea la boleta de venta.
		boleta = Bill.new
		if params[:utilizarPromo].size > 0
			boleta.total = (params[:total_a_pagar_sol].to_f)
			boleta.descuento = (params[:total_a_pagar_sol].to_f)/(1-((params[:descuento].to_f)/100))-(params[:total_a_pagar_sol].to_f)
			boleta.promotion_id = Trip.find(params[:viaje_id].to_i).promotion_id
		else
			boleta.total = (params[:total_a_pagar_sol].to_f)
			boleta.descuento = 0
		end
		boleta.fechaEmision = Time.now
		boleta.save

		if params[:utilizarPromo].size > 0
			# Deduce los puntos del pasajero
			p_frec = Passenger.find_by_numDocumento(params[:nro_doc_pasajero_frec].to_i)
			p_frec.puntos -= params[:ptos_requeridos].to_i * numT
			p_frec.save

			# Registra uso de la promocion por pasajero
			pxp = PassengerXPromotion.new
			pxp.trip_id = params[:viaje_id].to_i
			pxp.passenger_id = p_frec.id
			pxp.promotion_id = params[:promocion_id].to_i
			pxp.fechaUtilizada = Time.now
			
			pxp.save
		end

		# El numero de boletos esta especificado por la cantidad ingresada en params[:asiento]
		if params[:tipoVenta] == 'Directa'
			asiento = params[:asiento]

			# Se especifican todas las listas
			tipo_doc = params[:tipo_doc]
			nro_documento = params[:nro_documento]
			nombre = params[:nombre]
			ape_pat = params[:ape_pat]
			ape_mat = params[:ape_mat]
			tipo_comida = params[:tipo_comida]
			genero_pelicula = params[:genero_pelicula]

			asiento.each_pair do |a1,a2|
				# Crea un ticket nuevo
				ticket = Ticket.new

				# Identifica al pasajero
				pasajero = Passenger.find_by_numDocumento(nro_documento["#{a1}"])

				# Si no se encontro el pasajero, se crea su registro con datos basicos
				if pasajero.nil? then
					pasajero = Passenger.new

					pasajero.numDocumento = nro_documento["#{a1}"]
					pasajero.esfrecuente = 0
					pasajero.puntos = 0
					pasajero.nombre = nombre["#{a1}"]
					pasajero.ape_paterno = ape_pat["#{a1}"]
					pasajero.ape_materno = ape_mat["#{a1}"]
					pasajero.document_type_id = tipo_doc["#{a1}"].to_i

					pasajero.save

					ticket.passenger_id = pasajero.id
				else
					ticket.passenger_id = pasajero
				end

				# Se especifica el genero y el tipo de comida
				ticket.movie_genere_id = genero_pelicula["#{a1}"]
				ticket.food_type_id = tipo_comida["#{a1}"]

				# Se especifica el numero del asiento a adquirir
				ticket.numAsiento = a1.to_i

				# Se asocia el viaje al ticket
				ticket.trip_id = params[:viaje_id].to_i

				# Se asocia la reserva al ticket
				ticket.reservation_id = nil

				# Se asocia la boleta de venta
				ticket.bill_id = boleta.id

				# Se graba el ticket
				if !ticket.save
					redirect_to root_path, :notice => "Fallo el registro de la compra de tickets."
				end
			end

			# Se actualiza el nro. de asientos reservados y adquiridos
			t = Trip.find_by_id(params[:viaje_id].to_i)
			t.numAsientosDisp -= (asiento.size)
			t.numAsientosAdquiridos += (asiento.size)
			t.save

			# Registro del pago
			pago_efec_sol = params[:pago_efec_sol].nil? ? nil : params[:pago_efec_sol].to_f
			pago_efec_dol = params[:pago_efec_dol].nil? ? nil : params[:pago_efec_dol].to_f
			pago_tc_sol = params[:pago_tc_sol].nil? ? nil : params[:pago_tc_sol].to_f
			pago_tc_dol = params[:pago_tc_dol].nil? ? nil : params[:pago_tc_dol].to_f
			pago_td_sol = params[:pago_td_sol].nil? ? nil : params[:pago_td_sol].to_f
			pago_td_dol = params[:pago_td_dol].nil? ? nil : params[:pago_td_dol].to_f

			puts pago_efec_sol
			puts pago_efec_dol
			puts pago_tc_sol
			puts pago_tc_dol
			puts pago_td_sol
			puts pago_td_dol

			if pago_efec_sol > 0 then
				puts "ENTRO A PAGO EFEC SOL"
				bd_efec_sol = BillDetail.new
				bd_efec_sol.monto = pago_efec_sol
				bd_efec_sol.bill_id = boleta.id
				bd_efec_sol.payment_type_id = PaymentType.find_by_descripcion("EFECTIVO").id
				bd_efec_sol.money_id = Money.find_by_descripcion("SOLES").id
				bd_efec_sol.save
			end
			if pago_efec_dol > 0 then
				puts "ENTRO A PAGO EFEC DOL"
				bd_efec_dol = BillDetail.new
				bd_efec_dol.monto = pago_efec_dol
				bd_efec_dol.bill_id = boleta.id
				bd_efec_dol.payment_type_id = PaymentType.find_by_descripcion("EFECTIVO").id
				bd_efec_dol.money_id = Money.find_by_descripcion("DOLARES").id
				bd_efec_dol.save
			end
			if pago_tc_sol > 0 then
				puts "ENTRO A PAGO TC SOL"
				bd_tc_sol = BillDetail.new
				bd_tc_sol.monto = pago_tc_sol
				bd_tc_sol.bill_id = boleta.id
				bd_tc_sol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE CREDITO").id
				bd_tc_sol.money_id = Money.find_by_descripcion("SOLES").id
				bd_tc_sol.save
			end
			if pago_tc_dol > 0 then
				puts "ENTRO A PAGO TC DOL"
				bd_tc_dol = BillDetail.new
				bd_tc_dol.monto = pago_tc_dol
				bd_tc_dol.bill_id = boleta.id
				bd_tc_dol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE CREDITO").id
				bd_tc_dol.money_id = Money.find_by_descripcion("DOLARES").id
				bd_tc_dol.save
			end
			if pago_td_sol > 0 then
				puts "ENTRO A PAGO TD SOL"
				bd_td_sol = BillDetail.new
				bd_td_sol.monto = pago_td_sol
				bd_td_sol.bill_id = boleta.id
				bd_td_sol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE DEBITO").id
				bd_td_sol.money_id = Money.find_by_descripcion("SOLES").id
				bd_td_sol.save
			end
			if pago_td_dol > 0 then
				puts "ENTRO A PAGO TD DOL"
				bd_td_dol = BillDetail.new
				bd_td_dol.monto = pago_td_dol
				bd_td_dol.bill_id = boleta.id
				bd_td_dol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE DEBITO").id
				bd_td_dol.money_id = Money.find_by_descripcion("DOLARES").id
				bd_td_dol.save
			end

			redirect_to root_path, :notice => 'Se registro correctamente la venta.'
		end
		# El numero de boletos esta especificado por la cantidad ingresada en params[:codigoReserva]
		if params[:tipoVenta] == 'Reserva'

			# Validacion de si la reserva ya ha sido utilizada para adquirir el ticket
			aux_t = Ticket.joins(" INNER JOIN reservations ON tickets.reservation_id = reservations.id").where("reservations.codigo = ?", params[:codigoReserva])
	
			if (aux_t.size == 0) then
				numTickets = Reservation.where("codigo = ?", params[:codigoReserva]).size
				reserva = Reservation.order("numAsiento").where("codigo = ?", params[:codigoReserva])

				# Se especifican todas las listas
				tipo_doc = params[:tipo_doc]
				nro_documento = params[:nro_documento]
				nombre = params[:nombre]
				ape_pat = params[:ape_pat]
				ape_mat = params[:ape_mat]
				tipo_comida = params[:tipo_comida]
				genero_pelicula = params[:genero_pelicula]

				reserva.each do |r|
					# Crea un ticket nuevo
					ticket = Ticket.new
					i=r.numAsiento
					# Identifica al pasajero
					pasajero = Passenger.find_by_numDocumento(nro_documento["#{r.numAsiento}"])

					# Si no se encontro el pasajero, se crea su registro con datos basicos
					if pasajero.nil? then
						pasajero = Passenger.new

						pasajero.numDocumento = nro_documento["#{r.numAsiento}"]
						pasajero.esfrecuente = 0
						pasajero.puntos = 0
						pasajero.nombre = nombre["#{r.numAsiento}"]
						pasajero.ape_paterno = ape_pat["#{r.numAsiento}"]
						pasajero.ape_materno = ape_mat["#{r.numAsiento}"]
						pasajero.document_type_id = tipo_doc["#{r.numAsiento}"]

						pasajero.save

						ticket.passenger_id = pasajero.id
					else
						ticket.passenger_id = pasajero
					end

					# Se especifica el genero y el tipo de comida
					ticket.movie_genere_id = genero_pelicula["#{r.numAsiento}"]
					ticket.food_type_id = tipo_comida["#{r.numAsiento}"]
	
					# Se especifica el numero del asiento a adquirir
					ticket.numAsiento = r.numAsiento

					# Se asocia el viaje al ticket
					ticket.trip_id = params[:viaje_id].to_i

					# Se asocia la reserva al ticket
					ticket.reservation_id = r.id

					# Se asocia la boleta de venta
					ticket.bill_id = boleta.id

					# Se graba el ticket
					if !ticket.save
						redirect_to root_path, :notice => "Fallo el registro de la compra de tickets."
					end
				end

				# Se actualiza el nro. de asientos reservados y adquiridos
				t = Trip.find_by_id(params[:viaje_id].to_i)
				t.numAsientosReservados -= (reserva.size-1)
				t.numAsientosAdquiridos += (reserva.size-1)
				t.save

				# Registro del pago
				pago_efec_sol = params[:pago_efec_sol].nil? ? nil : params[:pago_efec_sol].to_f
				pago_efec_dol = params[:pago_efec_dol].nil? ? nil : params[:pago_efec_dol].to_f
				pago_tc_sol = params[:pago_tc_sol].nil? ? nil : params[:pago_tc_sol].to_f
				pago_tc_dol = params[:pago_tc_dol].nil? ? nil : params[:pago_tc_dol].to_f
				pago_td_sol = params[:pago_td_sol].nil? ? nil : params[:pago_td_sol].to_f
				pago_td_dol = params[:pago_td_dol].nil? ? nil : params[:pago_td_dol].to_f

				if pago_efec_sol > 0 then
					bd_efec_sol = BillDetail.new
					bd_efec_sol.monto = pago_efec_sol
					bd_efec_sol.bill_id = boleta.id
					bd_efec_sol.payment_type_id = PaymentType.find_by_descripcion("EFECTIVO").id
					bd_efec_sol.money_id = Money.find_by_descripcion("SOLES").id
					bd_efec_sol.save
				end
				if pago_efec_dol > 0 then
					bd_efec_dol = BillDetail.new
					bd_efec_dol.monto = pago_efec_dol
					bd_efec_dol.bill_id = boleta.id
					bd_efec_dol.payment_type_id = PaymentType.find_by_descripcion("EFECTIVO").id
					bd_efec_dol.money_id = Money.find_by_descripcion("DOLARES").id
					bd_efec_dol.save
				end
				if pago_tc_sol > 0 then
					bd_tc_sol = BillDetail.new
					bd_tc_sol.monto = pago_tc_sol
					bd_tc_sol.bill_id = boleta.id
					bd_tc_sol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE CREDITO").id
					bd_tc_sol.money_id = Money.find_by_descripcion("SOLES").id
					bd_tc_sol.save
				end
				if pago_tc_dol > 0 then
					bd_tc_dol = BillDetail.new
					bd_tc_dol.monto = pago_tc_dol
					bd_tc_dol.bill_id = boleta.id
					bd_tc_dol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE CREDITO").id
					bd_tc_dol.money_id = Money.find_by_descripcion("DOLARES").id
					bd_tc_dol.save
				end
				if pago_td_sol > 0 then
					bd_td_sol = BillDetail.new
					bd_td_sol.monto = pago_td_sol
					bd_td_sol.bill_id = boleta.id
					bd_td_sol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE DEBITO").id
					bd_td_sol.money_id = Money.find_by_descripcion("SOLES").id
					bd_td_sol.save
				end
				if pago_td_dol > 0 then
					bd_td_dol = BillDetail.new
					bd_td_dol.monto = pago_td_dol
					bd_td_dol.bill_id = boleta.id
					bd_td_dol.payment_type_id = PaymentType.find_by_descripcion("TARJETA DE DEBITO").id
					bd_td_dol.money_id = Money.find_by_descripcion("DOLARES").id
					bd_td_dol.save
				end

				redirect_to root_path, :notice => 'Se registro correctamente la venta.'
			else
				redirect_to root_path, :notice => "Ya se utilizo la reserva."
			end
		end
  end

  # PUT /tickets/1
  # PUT /tickets/1.xml
  def update
    @ticket = Ticket.find(params[:id])

    respond_to do |format|
      if @ticket.update_attributes(params[:ticket])
        format.html { redirect_to(@ticket, :notice => 'Ticket was successfully updated.') }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @ticket.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /tickets/1
  # DELETE /tickets/1.xml
  def destroy
    @ticket = Ticket.find(params[:id])
    @ticket.destroy

    respond_to do |format|
      format.html { redirect_to(tickets_url) }
      format.xml  { head :ok }
    end
  end
end
